/*************************
 * 文件名：IOT_AdminFile.c
 * 描述：文件管理
 * 功能：
 * 1.将工程师信息写入文件
 * 2.从文件中读取工程师信息
 * 3.将设备信息写入文件
 * 4.从文件中读取设备信息
 * 创建人：IOT_王旭
 * 创建时间：2024年9月26日17:55:30
 ************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "IOT_AdminFile.h"
#include "IOT_Admin_Function.h"
/****************************
函数名称：IOT_Engineer_FileWrite
描述：将工程师信息写入文件
参数：LinkList Head - 链表头节点，const char *filename - 文件名
返回值：无
****************************/
void IOT_Engineer_FileWrite(LinkList Head, const char *filename)
{
    FILE *file = fopen(filename, "wb"); // 打开文件进行写操作
    if (!file)
    {
        printf("无法打开文件进行写入：%s\n", filename);
        return;
    }
    LinkList p = Head->next; // 从头节点的下一个节点开始，即第一个工程师节点
    while (p != NULL)
    {
        fwrite(p, sizeof(Engineer), 1, file); // 写入工程师信息
        p = p->next;
    }
    fclose(file); // 关闭文件
}
/************************************
函数名称：IOT_Engineer_FileRead
描述：从文件中读取工程师信息
参数：LinkList Head - 链表头节点，const char *filename - 文件名
返回值：1，0
******************************/
int IOT_Engineer_FileRead(LinkList Head, const char *filename)
{
    FILE *file = fopen(filename, "rb");
    if (file == NULL)
    {
        printf("123");
        return 0;
    }

    LinkList p, q = Head; // q初始化为头节点
    while (1)
    {
        p = (LinkList)malloc(sizeof(Engineer));
        if (fread(p, sizeof(Engineer), 1, file) != 1) // 读取工程师信息
        {
            free(p); // 如果读取失败，释放分配的内存
            break;
        }
        p->next = NULL;
        q->next = p; // 将新节点链接到链表
        q = p;
    }
    fclose(file);
}

/*************************
函数名称：IOT_Equipment_FileWrite
描述：将设备信息写入文件
参数：EquipmentLink Arm ，const char *filename
返回值：无
***************************/

void IOT_Equipment_FileWrite(EquipmentLink Arm, const char *filename)
{
    FILE *file = fopen(filename, "wb");
    if (!file)
    {
        printf("无法打开文件进行写入：%s\n", filename);
        return;
    }
    EquipmentLink p = Arm->next; // 从第一个设备节点开始
    while (p != NULL)
    {
        fwrite(p, sizeof(Equipment), 1, file);
        p = p->next;
    }
    fclose(file);
}
/********************************
函数名称：IOT_Equipment_FileRead
描述：从文件中读取设备信息
参数：EquipmentLink Head ，const char *filename
返回值：1，0
***********************************/
int IOT_Equipment_FileRead(EquipmentLink Head, const char *filename)
{
    FILE *file = fopen(filename, "rb");
    if (!file)
        return 0;

    EquipmentLink p, q = Head;
    while (1)
    {
        p = (EquipmentLink)malloc(sizeof(Equipment));
        if (fread(p, sizeof(Equipment), 1, file) != 1)
        {
            free(p);
            break;
        }
        p->next = NULL;
        q->next = p;
        q = p;
    }
    fclose(file);
}
